/*
 * ReferenciaPatronBase.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 6/03/2011, 12:18:29 PM
 */

package com.ufps.cuatro.util.base;

import java.util.logging.Level;
import java.util.logging.Logger;

import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.generadores.GeneradorComponentes;

/**
 * <i><b>ReferenciaPatronBase:</b></i>:Esta Clase define una Representación en el Patron
 * actual utilizado. Asocia un Tipo de Dato Soportado con un Componente Base, Contenedor Base ó
 * Componente Personalizado.
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 6/03/2011
 * @see ObjectBase
 */
public class ReferenciaEspecialPatronBase extends ObjectBase{
    private static final long serialVersionUID = -4680949193326530904L;    
    
    private String caso;
    private int get;
    private int compatibilidad_get;
    private int set;    
    private int compatibilidad_set;
    private PatronRepresentacionBase objParent;       

    /** Constructor por Defecto. 
     *  Crea un nuevo objeto ReferenciaPatronBase 
     */
    public ReferenciaEspecialPatronBase() {        
        super();
    }    

    /**
     * Constructor utilizado en la Implementación.
     * @param id @DescripcionParametro
     * @param caso@DescripcionParametro
     * @param get @DescripcionParametro
     * @param compatibilidad_get @DescripcionParametro
     * @param set @DescripcionParametro
     * @param compatibilidad_set @DescripcionParametro
     */
    public ReferenciaEspecialPatronBase(int id, String caso, int get, int compatibilidad_get, int set, int compatibilidad_set) {
        super(id);
        this.caso = caso;
        this.get = get;
        this.compatibilidad_get = compatibilidad_get;
        this.set = set;
        this.compatibilidad_set = compatibilidad_set;
    }

    /**
     * Constructor utilizado en la Implementación.
     * @param id @DescripcionParametro
     * @param caso @DescripcionParametro
     * @param get @DescripcionParametro
     * @param compatibilidad_get @DescripcionParametro
     * @param set @DescripcionParametro
     * @param compatibilidad_set @DescripcionParametro
     * @param objParent @DescripcionParametro
     */
    public ReferenciaEspecialPatronBase(int id, String caso, int get, int compatibilidad_get, int set, int compatibilidad_set, PatronRepresentacionBase objParent) {
        super(id);
        this.caso = caso;
        this.get = get;
        this.compatibilidad_get = compatibilidad_get;
        this.set = set;
        this.compatibilidad_set = compatibilidad_set;
        this.objParent = objParent;
    }        

    /**
     * Devuelve el Id de Generación del Componente Generador Asociado para Operaciones de Salida.
     * @return Id de Generación del Componente Generador Asociado para Operaciones de Salida.
     */
    public int getGet() {
        return get;
    }

    /**
     * Establece el Id de Generación del Componente Generador Asociado para Operaciones de Salida.
     * @param get Id de Generación del Componente Generador Asociado para Operaciones de Salida.
     */
    public void setGet(int get) {
        this.get = get;
    }

    /**
     * Devuelve el Patrón de Representación Asociado.
     * @return Patrón de Representación Asociado.
     */
    public PatronRepresentacionBase getObjParent() {
        return objParent;
    }

    /**
     * Establece el Patrón de Representación Asociado.
     * @param objParent Patrón de Representación Asociado.
     */
    public void setObjParent(PatronRepresentacionBase objParent) {
        this.objParent = objParent;
    }

    /**
     * Devuelve el Id de Generación del Componente Generador Asociado para Operaciones de Entrada.
     * @return Id de Generación del Componente Generador Asociado para Operaciones de Entrada.
     */
    public int getSet() {
        return set;
    }

    /**
     * Establece el Id de Generación del Componente Generador Asociado para Operaciones de Entrada.
     * @param set Id de Generación del Componente Generador Asociado para Operaciones de Entrada.
     */
    public void setSet(int set) {
        this.set = set;
    }

    /**
     * Devuelve el Nombre de Caso del Tipo de Dato Soportado asociado a la Referencia.
     * @return Nombre de Caso del Tipo de Dato Soportado asociado a la Referencia.
     */
    public String getCaso() {
        return caso;
    }

    /**
     * Establece Nombre de Caso del Tipo de Dato Soportado asociado a la Referencia.
     * @param caso Nombre de Caso del Tipo de Dato Soportado asociado a la Referencia.
     */
    public void setType(String caso) {
        this.caso = caso;
    }

    /**
     * Devuelve la Compatibilidad del Componente para Operaciones de Salida.
     * @return Compatibilidad del Componente para Operaciones de Salida.
     */
    public int getCompatibilidad_get() {
        return compatibilidad_get;
    }

    /**
     * Establece la Compatibilidad del Componente para Operaciones de Salida.
     * @param compatibilidad_get Compatibilidad del Componente para Operaciones de Salida.
     */
    public void setCompatibilidad_get(int compatibilidad_get) {
        this.compatibilidad_get = compatibilidad_get;
    }

    /**
     * Devuelve la Compatibilidad del Componente para Operaciones de Entrada.
     * @return Compatibilidad del Componente para Operaciones de Entrada.
     */
    public int getCompatibilidad_set() {
        return compatibilidad_set;
    }

    /**
     * Establece la Compatibilidad del Componente para Operaciones de Entrada.
     * @param compatibilidad_set Compatibilidad del Componente para Operaciones de Entrada.
     */
    public void setCompatibilidad_set(int compatibilidad_set) {
        this.compatibilidad_set = compatibilidad_set;
    }    
    
    @Override
    public int compareTo(Object o) {
        try{
            ReferenciaEspecialPatronBase obj = (ReferenciaEspecialPatronBase) o;
            if(this.id > obj.id) {
                return 1;
            }
            else if(this.id < obj.id) {
                return -1;
            }
            else {
                return 0;
            }
        }catch(java.lang.NullPointerException ex){}
        return 0;
    }

    @Override
    public String toString() {
        try{
            return objParent.getNombre() + " Ref: " + id + " Caso: " + caso;
        }catch(java.lang.NullPointerException ex){}
        return "";
    }
    
    /**
     * Devuelve el Componente Base para la Representación de la Referencia
     * de acuerdo al modo de operacion y tipo de compatibilidad.
     * @param modo Modo de Operación
     * @param tipo Tipo de Compatibilidad
     * @return Componente Base
     */
    public ComponenteBase getRepresentacion(int modo, boolean tipo){
      if(GeneradorComponentes.objTiposDatoRepresentacionBase != null){
            try{
                TipoDatoRepresentacionBase objTipoDatoBase =
                        GeneradorComponentes.objTiposDatoRepresentacionBase.get(0);

                if(tipo){//usa el modo de compatibilidad del tipo de dato

                    switch(modo){
                        case Utileria.GET://Salida
                            if(objTipoDatoBase.getCompatibilidad() == 0){
                                return GeneradorComponentes.objComponentesBase.get(this.get);
                            }
                            else if(objTipoDatoBase.getCompatibilidad() == 1){
                                return GeneradorComponentes.objComponentesPersonalizadosBase.get(this.get);
                            }
                            break;
                        case Utileria.SET://Entrada
                            if(objTipoDatoBase.getCompatibilidad() == 0){
                                return GeneradorComponentes.objComponentesBase.get(this.set);
                            }
                            else if(objTipoDatoBase.getCompatibilidad() == 1){
                                return GeneradorComponentes.objComponentesPersonalizadosBase.get(this.set);
                            }
                            break;
                    } 
                }
                else{//usa el modo de compatibilidad de la referencia

                    switch(modo){
                        case Utileria.GET://Salida
                            if(this.getCompatibilidad_get() == 0){
                                return GeneradorComponentes.objComponentesBase.get(this.get);
                            }
                            else if(this.getCompatibilidad_get() == 1){
                                return GeneradorComponentes.objComponentesPersonalizadosBase.get(this.get);
                            }
                            break;
                        case Utileria.SET://Entrada
                            if(this.getCompatibilidad_set() == 0){
                                return GeneradorComponentes.objComponentesBase.get(this.set);
                            }
                            else if(this.getCompatibilidad_set() == 1){
                                return GeneradorComponentes.objComponentesPersonalizadosBase.get(this.set);
                            }
                            break;
                    } 

                }
            }catch(java.lang.ArrayIndexOutOfBoundsException ex){            
                Logger.getLogger(ReferenciaEspecialPatronBase.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
      return null;
    }
    
    /**
     * Devuelve el Tipo de Dato Asociado a la Representacion.
     * @return Tipo de Dato Asociado a la Representacion.
     */
    public TipoDatoRepresentacionBase getTipoDato(){
        try{
            if(GeneradorComponentes.objTiposDatoRepresentacionBase != null){
                return GeneradorComponentes.objTiposDatoRepresentacionBase.get(0);
            }
        }catch(java.lang.ArrayIndexOutOfBoundsException ex){   
            Logger.getLogger(ReferenciaEspecialPatronBase.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    

}

